﻿#region License Information
// Copyright (c) 2005 - 2009, Allan Spartacus Mangune (allan@owlpal.com)
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, 
// are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice, this list 
//   of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright notice, this list of 
//   conditions and the following disclaimer in the documentation and/or other materials provided 
//   with the distribution.
//
// * Neither the name of Owlpal nor the names of its contributors may be used to endorse or 
//   promote products derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS 
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 
// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
#endregion

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;

namespace Owlpal.Models.Repositories
{
    public class NewsletterRepository : Repository<Owlpal.Models.Newsletter>, INewsletterRepository
    {
        public NewsletterRepository()
            : base(new Owlpal.Models.Repositories.Factories.DataContextFactory())
        {

        }

        public List<Models.Newsletter> FindAllNewsletters()
        {
            List<Models.Newsletter> newsletters = new List<Owlpal.Models.Newsletter>();
            var query = from n in dataContextFactory.Context.Newsletter
                        select n;
            foreach (var newsletterEntity in query)
            {
                Models.Newsletter newsletter = new Owlpal.Models.Newsletter();
                newsletter.ID = newsletterEntity.ID;
                newsletter.Body = newsletterEntity.Body;
                newsletter.Status = newsletterEntity.Status;
                newsletter.Subject = newsletterEntity.Subject;
                newsletter.DateCreated = newsletterEntity.DateCreated;
                newsletter.DateUpdated = newsletterEntity.DateUpdated;
                newsletter.DateSent = newsletterEntity.DateSent;
                newsletters.Add(newsletter);
            }
            return newsletters;
        }

        public Models.Newsletter CreateNewsletter(Models.Newsletter newsletter)
        {
            Repositories.Newsletter newsletterEntity = new Newsletter();
            newsletterEntity.ID = newsletter.ID;
            newsletterEntity.Body = newsletter.Body;
            newsletterEntity.CreatedBy = (Guid)newsletter.Creator.ProviderUserKey;
            newsletterEntity.DateCreated = newsletter.DateCreated;
            newsletterEntity.DateUpdated = newsletter.DateUpdated;
            newsletterEntity.DateSent = newsletter.DateSent;
            newsletterEntity.Status = newsletter.Status;
            newsletterEntity.Subject = newsletter.Subject;
            newsletterEntity.UpdatedBy = Guid.Empty; ;
            dataContextFactory.Context.AddToNewsletter(newsletterEntity);
            try
            {
                dataContextFactory.Context.SaveChanges();
            }
            catch (Exception ex)
            { 
            
            }
            return newsletter;
        }

        public Models.Newsletter UpdateNewsletter(Models.Newsletter newsletter)
        {
            var newsletterEntity = dataContextFactory.Context.Newsletter.FirstOrDefault(n => n.ID == newsletter.ID);
            if (newsletterEntity != null)
            {
                newsletterEntity.Status = newsletter.Status;
                newsletterEntity.Subject = newsletter.Subject;
                newsletterEntity.Body = newsletter.Body;
                newsletterEntity.UpdatedBy = (Guid)newsletter.Updator.ProviderUserKey;
                newsletterEntity.DateUpdated = newsletter.DateUpdated;
                try
                {
                    dataContextFactory.Context.SaveChanges();
                }
                catch (Exception ex)
                {

                }
                return newsletter;
            }
            else
            {
                return null;
            }
        }

        public void DeleteNewsletter(Models.Newsletter newsletter)
        {
            var newsletterEntity = dataContextFactory.Context.Newsletter.FirstOrDefault(n => n.ID == newsletter.ID);
            if (newsletterEntity != null)
            {
                dataContextFactory.Context.DeleteObject(newsletterEntity);
                try
                {
                    dataContextFactory.Context.SaveChanges();
                }
                catch (Exception ex)
                { 
                    
                }
            }
        }

        public Models.Newsletter Find(Guid id)
        {
            Models.Newsletter newsletter = null;
            var newsletterEntity = dataContextFactory.Context.Newsletter.FirstOrDefault(n => n.ID == id);
            if (newsletterEntity != null)
            {
                newsletter = new Owlpal.Models.Newsletter();
                newsletter.ID = newsletterEntity.ID;
                newsletter.Status = newsletterEntity.Status;
                newsletter.Body = newsletterEntity.Body;
                newsletter.DateCreated = newsletterEntity.DateCreated;
                newsletter.DateUpdated = newsletterEntity.DateUpdated;
                newsletter.Subject = newsletterEntity.Subject;
                newsletter.Creator = Membership.GetUser(newsletterEntity.CreatedBy);
            }
            return newsletter;
        }
    }
}
